home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Software Vault: The Gold Collection
/
Software Vault - The Gold Collection (American Databankers) (1993).ISO
/
cdr26
/
netprog.zip
/
NETPROG.TAR
/
net.s5
/
udpcli.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-12-17
|
3KB
|
108 lines
/*
* Example of client using UDP protocol.
*/
#include "inet.h"
main(argc, argv)
int argc;
char *argv[];
{
int tfd;
struct t_unitdata unitdata;
struct sockaddr_in serv_addr;
pname = argv[0];
/*
* Open a UDP endpoint.
*/
if ( (tfd = t_open(DEV_UDP, O_RDWR, (struct t_info *) 0)) < 0)
err_dump("client: can't t_open %s", DEV_UDP);
/*
* Bind any local address for us.
*/
if (t_bind(tfd, (struct t_bind *) 0, (struct t_bind *) 0) < 0)
err_dump("client: t_bind error");
/*
* Initialize a sockaddr_in structure with the address of the
* the server we want to send datagrams to.
*/
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = inet_addr(SERV_HOST_ADDR);
serv_addr.sin_port = htons(SERV_UDP_PORT);
/*
* Now initialize a unitdata structure for sending to the server.
*/
unitdata.addr.maxlen = sizeof(serv_addr); /* server's addr */
unitdata.addr.len = sizeof(serv_addr);
unitdata.addr.buf = (char *) &serv_addr;
unitdata.opt.maxlen = 0; /* no options */
unitdata.opt.len = 0;
unitdata.opt.buf = (char *) 0;
doit(tfd, &unitdata, stdin); /* do it all */
t_close(tfd);
exit(0);
}
/*
* Read the contents of the FILE *fp, write each line to the transport
* endpoint (to the server process), then read a line back from
* the transport endpoint and print it on the standard output.
*/
doit(tfd, sudataptr, fp)
register int tfd;
struct t_unitdata *sudataptr; /* unitdata for sends */
register FILE *fp;
{
int n, flags;
char sendline[MAXLINE], recvline[MAXLINE + 1];
char *t_alloc();
struct t_unitdata *rudataptr; /* unitdata for receives */
/*
* Allocate memory for the t_unitdata structure and the address field
* in that structure. This allows any size of address to be handled
* by this function.
*/
rudataptr = (struct t_unitdata *) t_alloc(tfd, T_UNITDATA, T_ADDR);
if (rudataptr == NULL)
err_dump("server: t_alloc error for T_UNITDATA");
while (fgets(sendline, MAXLINE, fp) != NULL) {
n = strlen(sendline);
sudataptr->udata.len = n;
sudataptr->udata.buf = sendline;
if (t_sndudata(tfd, sudataptr) < 0)
err_dump("client: t_sndudata error");
/*
* Now read a message from the transport endpoint and
* write it to our standard output.
*/
rudataptr->opt.maxlen = 0; /* don't care about options */
rudataptr->udata.maxlen = MAXLINE;
rudataptr->udata.buf = recvline;
if (t_rcvudata(tfd, rudataptr, &flags) < 0)
err_dump("client: t_rcvudata error");
recvline[rudataptr->udata.len] = 0; /* null terminate */
fputs(recvline, stdout);
}
if (ferror(fp))
err_dump("client: error reading file");
}